import java.util.Stack;

public class test2 {
    //力扣  394.字符串解码
    public String decodeString(String s) {
        Stack<Integer> stack1 = new Stack<>();
        Stack<StringBuffer> stack2 = new Stack<>();
        //这里记得初始化放入一个空的字符串，防止空栈异常
        stack2.push(new StringBuffer());
        for(int i = 0;i<s.length();){

            char tmp = s.charAt(i);
            int num = 0;
            StringBuffer str = new StringBuffer();
            //遇到数字，
            if(s.charAt(i)>='0' && s.charAt(i)<='9'){
                //提取完整的数字
                while(i<s.length() && s.charAt(i)>='0' && s.charAt(i)<='9'){
                    num = num*10+(s.charAt(i)-'0');
                    i++;
                }
                //入栈
                stack1.push(num);
                //遇到左括号，提取它后面完整的字母
            }else if(s.charAt(i)=='['){
                //这个一定要记得：
                i++;
                while(i<s.length() && s.charAt(i)>='a' && s.charAt(i)<='z'){
                    str.append(s.charAt(i));
                    i++;
                }
                //入栈
                stack2.push(str);
                //遇到右括号，此时需要出栈操作
            }else if(s.charAt(i)==']'){
                int a = stack1.pop();
                StringBuffer b = stack2.pop();
                StringBuffer tmp3 = new StringBuffer();
                //根据出栈的数字和字符，生成需要的字符串
                while(a!=0){
                    tmp3.append(b);
                    a--;
                }
                //把字符串接到栈顶元素的后面
                stack2.push(stack2.pop().append(tmp3));
                //这个一定也要记住
                i++;
                //遇到单独的字母，
            }else if(s.charAt(i)>='a' && s.charAt(i)<='z'){
                StringBuffer tmp2 = new StringBuffer(stack2.pop());
                //提取完整的单词
                while(i<s.length() && s.charAt(i)>='a' && s.charAt(i)<='z'){
                    tmp2.append(s.charAt(i));
                    i++;
                }
                //直接将字符串接入到栈顶元素的后面
                stack2.push(tmp2.append(str));
            }
        }    //栈顶元素就是答案
        return stack2.pop().toString();

    }
}
